<?php
/**
 * Widget挂件处理类
 *
 * @author Mo yi <root@imoi.cn>
 * @link   http://www.imoi.cn
 * @copyright Copyright &copy; 2010-2012 DuoLam Software LLC
 * @license http://www.imoi.cn/license/
 * @version $Id: dpWidget.php 1 2012-04-04 09:31:13Z Mo.yi $
 * @package view
 * @since 1.0
 */

class dpWidget extends dpComponent
{
	/**
	 * widget参数设置
	 */
	public $options;

	/**
	 * 视图
	 */
	protected $view;

	/**
	 * widget视图基础目录
	 */
	protected $path;

	/**
	 * 构造方法
	 * @param array $options widget参数
	 */
	public function __construct($options = array())
	{
		$this->options = $options;
	}

	/**
	 * 外部静态调用widget方法
	 * @param string $widget  widget目录地址，支持别名
	 * @param string $className widget类名
	 * @param array  $options widget参数
	 */
	public static function execute($widget, $className, $options = array())
	{
		class_exists($className) || D::import($widget);
		$class = new $className($options);
		return $class->run();
	}

	/**
	 * 运行widget
	 */
	public function run()
	{
		$this->view = new dpViewRender;
		$this->init();
		return $this->main();
	}

	/**
	 * 魔术方法，调用不存在的属性执行该方法
	 */
	public function __get($name){}

	/**
	 * 魔术方法，调用不存在的方法执行该方法
	 */
	public function __call($name, $params)
	{
		!method_exists($this, $name) && dpException::error('widget调用的方法不存在：$name，'.get_class($this));
	}

	/**
	 * widget初始化
	 */
	protected function init(){}

	/**
	 * widget执行
	 */
	protected function main(){}

	/**
	 * 设置视图目录
	 * 不用写绝对地址，设置相对于widget/目录即可
	 * 例如：view/slide
	 * @param string $path 相对于widget目录的视图基础地址
	 */
	public function setViewPath($path)
	{
		$this->path = $path;
	}

	/**
	 * 获取设置的视图基础目录地址
	 * @return string 
	 */
	public function getViewPath()
	{
		return empty($this->path) ? 'widget'.DS.'view' : $this->path;
	}

	/**
	 * 向视图注入变量
	 * @param string or array $var   变量名或者变量列表
	 * @param string or array $value 变量值
	 */
	public function assign($var, $value = '')
	{
		$this->view->assign($var, $value);
	}

	/**
	 * 渲染视图
	 * @param string  $viewFile 视图文件名
	 * @param array   $var      注入模板的变量
	 * @param boolean $return   是否返回模板内容
	 */
	public function render($file, $var = array(), $return = false)
	{
		$this->view->setViewPath(D::getPathAlias('app').DS.$this->getViewPath().DS);
		$this->view->setCtrlViewPath(DS.'app'.DS.$this->getViewPath().DS);
		return $this->view->render($file, $var, $return);
	}
}